package com.qf.controller;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.lang.reflect.Method;

/**
 * Created by Administrator on 2021/10/19.
 */
public class BaseController extends HttpServlet {

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //接收参数：即为子类的方法名
        String param = req.getParameter("param");
        if(param==null)
            param="all";
        //客户端请求子类的映射路径，调用从父类继承的方法service，这个方法将请求参数与子类方法联系起来；
        try {
//        this表示当前类及其子类的实例
            Method method=this.getClass().getDeclaredMethod(param,HttpServletRequest.class,HttpServletResponse.class);//获得类对象中的方法
            //再收子类方法的返回值
            Object obj=method.invoke(this,req,resp);//int/Integer/String/boolean
            String url=(String)obj;
            //重定向和请求转发
            if(url.startsWith("forward")){
                //请求a.jsp实际看到的是b.jsp
                //请求转发
                req.getRequestDispatcher(url.substring(8)+".jsp").forward(req,resp);
            }else if(url.startsWith("redirect")){
                //请求a.jsp，再发一次请求才能看到b.jsp
                //重定向
                resp.sendRedirect(url.substring(9)+".jsp");
            }else if(url.startsWith("controller")){
                //重定向到控制器
                resp.sendRedirect(url.substring(11));
            }else{
                //异步请求的处理结果方式
                //将输出以流向页面发送
                PrintWriter pw=resp.getWriter();
                pw.write(url);
                pw.flush();
                pw.close();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}
